package com.aaa.imserver.netty;

import io.netty.channel.ChannelHandlerContext;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class UserChannelCtxMap {

    /**
     *  维护userId和ctx的关联关系，格式:Map<userId,map<terminal，ctx>>
     */
    private static Map<Long, Map<Integer, ChannelHandlerContext>> channelMap = new ConcurrentHashMap();

    public static void addChannelCtx(Long userId, Integer channel, ChannelHandlerContext ctx) {
        channelMap.computeIfAbsent(userId, key -> new ConcurrentHashMap()).put(channel, ctx);
    }

    /**
     * 从通道映射中移除指定用户的指定终端的通道上下文。
     * 这个方法用于当用户断开连接或者需要从映射中删除特定终端的上下文时。
     *
     * @param userId 用户ID。这个参数用于确定要移除通道上下文的用户。
     * @param terminal 终端标识。这个参数用于确定要移除的特定终端的通道上下文。
     */
    public static void removeChannelCtx(Long userId, Integer terminal) {
        // 检查userId和terminal是否都不为null，并且用户ID是否存在于channelMap中
        if (userId != null && terminal != null && channelMap.containsKey(userId)) {
            // 获取用户ID对应的通道上下文映射
            Map<Integer, ChannelHandlerContext> userChannelMap = channelMap.get(userId);
            // 从用户的通道映射中移除指定终端的通道上下文
            userChannelMap.remove(terminal);
        }
    }


    public static ChannelHandlerContext getChannelCtx(Long userId, Integer terminal) {
        if (userId != null && terminal != null && channelMap.containsKey(userId)) {
            Map<Integer, ChannelHandlerContext> userChannelMap = channelMap.get(userId);
            if (userChannelMap.containsKey(terminal)) {
                return userChannelMap.get(terminal);
            }
        }
        return null;
    }

    /**
     * 根据用户ID获取对应的ChannelHandlerContext映射。
     * 此方法用于从全局渠道映射中检索特定用户ID关联的ChannelHandlerContext。
     * 如果找不到对应的映射或用户ID为null，则返回null。
     *
     * @param userId 用户的唯一标识符。用于查找与用户关联的ChannelHandlerContext。
     * @return 包含用户ID到ChannelHandlerContext映射的Map。如果找不到映射或用户ID为null，则返回null。
     */
    public static Map<Integer, ChannelHandlerContext> getChannelCtx(Long userId) {
        // 检查用户ID是否为null，如果是则直接返回null
        if (userId == null) {
            return null;
        }
        // 从全局channelMap中获取指定用户ID对应的ChannelHandlerContext映射
        return channelMap.get(userId);
    }

}
